#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
//
//int main()
//{
//  fputs("hello stderr\n", stderr);
//  fputs("hello stdout\n", stdout);
//
//  return 0;
//}
//
//
//int main()
//{
//  int fd = open("log.txt", O_RDWR);
//  if(fd < 0)
//  {
//    perror("open");
//
//  }
//
//  dup2(fd, 1);
//  fputs("hello ! in dup2!\n", stdout);
//  return 0;
//}
//^^
//^^int main()
//^^{
//^^  int fd = open("log.txt", O_RDWR);
//^^  if(fd < 0){
//^^    perror("open");
//^^  }
//^^
//^^  dup2(fd, 1);
//^^  fputs("hello ! in dup2!!!!!\n", stdout);
//^^  return 0;
//^^}
//
//int main()
//{
//  //c语言
//  printf("I am printf\n");
//  fputs("I am printf\n", stdout);
//t
//  //linux系统
//  const char* str = "I am write\n";
//  write(1, str, strlen(str));
//  fork();
//  return 0;
//}
//
//
//int main()
//{
//  umask(0);
//  int fd = open("bit.txt", O_RDWR | O_CREAT,  0664 );
//  if(fd < 0){
//    perror("open");
//    return -1;
//  }
//
// const  char* ch = "I like Linux!\n";
//  int wd = write(fd, ch, strlen(ch));
//  if(wd < 0){
//    perror("write");
//  }
//
//  //再进行一次写操作后，文件光标会指到最后，所以为了下次的读，要通过lseek函数让光标指到最前
//  lseek(fd, 0, SEEK_SET);
//
//  char ch1[1024] = { 0 };
//  int rd = read(fd, ch1, 1023);
//  if(rd < 0){
//  perror("read");
//  return -1;
//  }
//  else if(rd == 0){
//    printf("end of file\n");
//    return -1;
//  }
//
//  printf("%s", ch1);
//
//  close(fd);
//  return 0;
//}
//
//int main()
//{
//    //将当前进程的默认文件创建权限掩码设置为0--- 并不影响系统的掩码，仅在当前进程内生效
//    umask(0);
//    //int open(const char *pathname, int flags, mode_t mode);
//    int fd = open("./bite", O_CREAT|O_RDWR, 0664);
//    if(fd < 0) {
//        perror("open error");
//        return -1; 
//    }   
//    char *data = "i like linux!\n";
//    //ssize_t write(int fd, const void *buf, size_t count);
//    ssize_t ret = write(fd, data, strlen(data));
//    if (ret < 0) {
//        perror("write error");
//        return -1; 
//    }   
//    //off_t lseek(int fd, off_t offset, int whence);
//    lseek(fd, 0, SEEK_SET);
//    char buf[1024] = {0};
//    //ssize_t read(int fd, void *buf, size_t count);
//    ret = read(fd, buf, 1023);
//    if (ret < 0) {
//        perror("read error");
//        return -1; 
//    }else if (ret == 0) {
//        printf("end of file!\n");
//        return -1; 
//    }   
//    printf("%s", buf);
//    close(fd);
//    return 0;
//}

int main()
{
  //打开文件
  FILE* pFile = fopen("bite.txt", "wb+");
  
  if(pFile == NULL){
    perror("fopen error");
    return -1;
  }

 //重置文件偏移量,使得文件光标在从起始位置偏移0字节,即回到起始位置
//fseek(pFile, 0, SEEK_SET);

 //写
 const char* buff = "Linux is easy!\n";
 size_t ret = fwrite(buff, 1, strlen(buff), pFile);

  if(ret != strlen(buff)){
    perror("fwrite error");
    return -1;
  }

  //重置偏移量至开头
  fseek(pFile, 0, SEEK_SET);

  //读
  char buff2[1024] = {0};
  ret =  fread(buff2, 1, 1023, pFile);
  if(ret == 0){
    if(ferror(pFile)) printf("fread error\n");//判断上一次io是否正确
    if(feof(pFile)) printf("read end of file!\n");//判断是否读到了文件末尾
    return -1;
  }

  printf("%s\n", buff2);
  fclose(pFile);
  return 0;

  
}
